package com.qf.controller;

import com.qf.pojo.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;
import com.qf.utils.Constants;
import com.qf.utils.StrUtils;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
 * @author mkr
 * @version V1.0
 * @Project java2203-mkr
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/5/23 17:06
 */
@WebServlet("/user")
public class UserController extends BaseServlet {
    /**
     * 用户注册，校对用户名是否可用
     */
    public void check(HttpServletRequest request , HttpServletResponse response) throws IOException {
        //1、接收用户名参数
        String username = request.getParameter("username");
        //2、调用service，到数据库中查询该用户名是否存在，如果存在则用户名不可用，如果不存在，则用户名可用
        UserService userService = new UserServiceImpl();
        boolean check = userService.check(username);
        //3、将是否可用的信息返回给页面展示
        if (check){
            //用户名可用
                response.getWriter().write(Constants.NOT_HAS_USER);
        }else {
            //用户名不可用
                response.getWriter().write(Constants.HAS_USER);
        }
    }
    /**
     * 消费者用户登录
     */
    public String login(HttpServletRequest request , HttpServletResponse response) {
        //1、获取用户名参数
        String username = request.getParameter("username");
        //2、获取用户密码参数
        String password = request.getParameter("password");
        //3、获取用户验证码参数
        String code = request.getParameter("code");
        //4、获取用户是否自动登录参数
        String auto = request.getParameter("auto");
        //5、判断用户名、密码、验证码是否为空、如果为空重定向到登录界面
        if (!StrUtils.empty(username) || !StrUtils.empty(password) || !StrUtils.empty(code)) {
            request.setAttribute("msg", "用户名、密码、验证码不能为空！");
            //转发到首页
            return "forward:/login.jsp";
        }
        //6、校验验证码是否正确、如果不正确重定向到登录页面
        String sessionCode = (String) request.getSession().getAttribute("code");
        if (!code.equalsIgnoreCase(sessionCode)) {
            request.setAttribute("username", username);
            request.setAttribute("password", password);
            request.setAttribute("msg", "用户名、密码、验证码不能为空！");
            //转发到首页
            return "forward:/login.jsp";
        }
        //7、调用service业务方法、完成用户名、密码校验
        UserService userService = new UserServiceImpl();
        User user = userService.login(username, password);

        //8、判断用户名、密码是否错误，如果错误返回提示信息并重新登录
        if (user == null) {
            request.setAttribute("username", username);
            request.setAttribute("password", password);
            request.setAttribute("msg", "用户名或者密码错误！");
            //跳转到登录界面
            return "forward:/login.jsp";
        }
        //9、登录成功、将用户信息存放入tomcat的session会话中
        request.getSession().setAttribute("loginUser", user);
        //10、判断用户是否需要自动登录
        if ("on".equals(auto)) {
            Cookie cookie = new Cookie(Constants.AUTO_NAME, user.getUsername());
            //设置cookie的保存路径
            cookie.setPath("/");
            //设置cookie保存数据的时间
            cookie.setMaxAge(60 * 60 * 24 * 14);
            //通过响应将cookie写到浏览器中
            response.addCookie(cookie);
        }
        //11、跳转到首页
        return "redirect:/goods?method=index";
    }

    /**
     * 消费者用户注册
     * @param request
     * @param response
     * @return
     */
    public String register(HttpServletRequest request , HttpServletResponse response) {
        //1、获取页面传入的所有参数，key代表页面input框的name属性，value就是input框中的值
        Map<String, String[]> parameterMap = request.getParameterMap();
        //2、将参数封装成User对象
        //创建用户对象
        User user = new User();
        //利用beanUtils工具类，将map中的数据全部自动set到user对象中
        //使用要求：user对象的属性名必须和页面input框中的name属性一致，实体类必须实现Serializable序列化接口
        try {
            BeanUtils.populate(user, parameterMap);
            //3、调用service，将用户对象保存到mysql数据库的用户表中
            UserService userService = new UserServiceImpl();
            int count = userService.createUser(user);
            //4、跳转到注册成功页面
            if (count > 0) {
                return "redirect:/registerSuccess.jsp";
            } else {
                //注册失败
                return "redirect:/register.jsp";
            }

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return null;
    }

}
